#include <stdio.h>
/*
指针
	内存
	内存提供了空间，类似与现实生活中对空间的利用。
	在现实生活中用地址来编号，在内存中也会进行编号
	 __________________________
	| ________________________ |
	||          		      ||
	||           1		      ||
	||________________________||
	| ________________________ |
	||          		      ||
	||           2		      ||
	||________________________||
	| ________________________ |
	||          		      ||
	||           3		      ||
	||________________________||
	| ________________________ |	--> 内存
	||          		      ||
	||          ... 	      ||
	||________________________||
	|__________________________|

	1.内存是怎么编号的？
		系统中分为32位与64位
		32位 --> 32根地址线 --> 一个序列为32bit    64位 --> 64根地址线 --> 一个序列为64bit
		地址线是物理线，可以通电，正电为1，负电为0
		将电信号转换为数字信号，组成了有1和0的二进制序列
		32位就代表有2^32（2的32次方）个序列，这些序列都可以作为内存中的编号，也就是内存单元的地址
		 ________________________________
		|00000000000000000000000000000000|
		| ...              		         |
		|01111111111111111111111111111111|
		|10000000000000000000000000000000|  --> 2^32
		| ...              		         |
		|11111111111111111111111111111111|
		|________________________________|
	2.一个内存单元是多大空间？
		计算机存储单位：Bit -> Byte -> KB -> MB -> GB -> TB -> PB -> ...
		一共有2^32个地址，也就有2^32个内存单元
		假设一个内存单元大小为1bit
			2^32 bit = 4,294,967,296 bit
			4,294,967,296 bit / 8 = 536,870,912 byte
			536,870,912 byte /1024 = 524,288 KB
			524,288 KB / 1024 = 512 MB
			512 MB /1024 = 0.5 GB
			char = 1byte = 8bit -> 8个地址
		所以为了便于管理，规定一个内存单元的大小为1byte，也就是一个字节，然后分配地址
指针就是地址
*/
int main()
{
	//指针变量
	int a = 10;  //a需要分配空间 -> 4byte
	//对程序进行调试后，点击调试->内存、监视->监视名称为&a，则可查看a运行后储存的地址（地址为4个字节中第一个字节的地址）
	printf("%p\n", &a);  
	//%p -- 用于打印地址  & -- 取地址（单目操作符）  &a -- 取出变量a的内存地址
	int *pa = &a;  
	//创建变量pa用于存放地址，在C语言中pa就叫做指针变量
	//*说明pa是指针变量  int说明pa指向的对象是int类型
	char ch = 'w';
	char *pc = &ch;
	*pc = 'p';  
	//*代表解引用操作  *pc就是通过pc里的地址找到ch
	printf("%c\n", ch);

	//指针变量的大小
	printf("%d\n", sizeof(char*));
	printf("%d\n", sizeof(short*));
	printf("%d\n", sizeof(int*));
	printf("%d\n", sizeof(long*));
	printf("%d\n", sizeof(long long*));
	printf("%d\n", sizeof(float*));
	printf("%d\n", sizeof(double*));
	//指针的大小是相同的
	//指针是用来存放地址的，指针需要多大空间取决于地址的存储需要多大
	//配置管理器中可以选择以32位或者64位运行虚拟机
	//32位平台一个内存序列为32bit = 4byte
	//64位平台一个内存序列为64bit = 8byte

	return 0;
}